home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 43 / Amiga Format CD43 (1999)(Future Publishing)(GB)(Track 1 of 2)[!][issue 1999-09].iso / -serious- / wb / flynn / source / global.c < prev    next >
C/C++ Source or Header  |  1999-06-15  |  4KB  |  205 lines

  1.  
  2. /*********************************************************************
  3. ----------------------------------------------------------------------
  4.  
  5.     global
  6.  
  7. ----------------------------------------------------------------------
  8. *********************************************************************/
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <time.h>
  14. #include <math.h>
  15.  
  16. #include <exec/memory.h>
  17. #include <proto/exec.h>
  18. #include <libraries/screennotify.h>
  19.  
  20.  
  21. #include "defs.h"
  22. #include "debug.h"
  23.  
  24.  
  25. static void MemStats(LONG *numalloc, LONG *numbytes);
  26.  
  27.  
  28. struct Library *GuiGFXBase = NULL;
  29. struct Library *ScreenNotifyBase = NULL;
  30. struct Library *IconBase = NULL;
  31.  
  32.  
  33. static APTR MainPool = NULL;
  34. static char versionstring[] = "$VER: " PROGNAME " " __VERSION__ "";
  35.  
  36.  
  37. /*********************************************************************
  38. ----------------------------------------------------------------------
  39.  
  40.     InitGlobal()
  41.     CloseGlobal()
  42.  
  43. ----------------------------------------------------------------------
  44. *********************************************************************/
  45.  
  46. void CloseGlobal(void)
  47. {
  48.     CloseLibrary(IconBase);
  49.     IconBase = NULL;
  50.  
  51.     CloseLibrary(GuiGFXBase);
  52.     GuiGFXBase = NULL;
  53.     
  54.     CloseLibrary(ScreenNotifyBase);
  55.     ScreenNotifyBase = NULL;
  56.  
  57.  
  58.     if (MainPool)
  59.     {
  60.         LONG count, bytes;
  61.         
  62.         MemStats(&count, &bytes);
  63.  
  64.         if (count > 0 && bytes > 0)
  65.         {
  66.             printf("*** internal memory leak detected - %ld allocations (%ld bytes) pending.\n", count, bytes);
  67.             printf("*** don't worry: the memory will be returned to the system.\n");
  68.         }
  69.         else if (count < 0 || bytes < 0)
  70.         {
  71.             printf("*** warning: pool memory structure might be corrupt.\n");
  72.             if (count < 0 && bytes < 0)
  73.             {
  74.                 printf("*** more memory has been freed than allocated (%ld allocations, %ld bytes).\n", -count, -bytes);
  75.             }
  76.         }
  77.  
  78.         DeletePool(MainPool);
  79.         MainPool = NULL;
  80.  
  81.     }
  82. }
  83.  
  84.  
  85.  
  86. BOOL InitGlobal(void)
  87. {
  88.     BOOL success = FALSE;
  89.  
  90.     MainPool = CreatePool(MEMF_FAST, POOLPUDSIZE, POOLTHRESHOLD);
  91.     if (!MainPool)
  92.     {
  93.         MainPool = CreatePool(MEMF_ANY, POOLPUDSIZE, POOLTHRESHOLD);
  94.     }
  95.  
  96.     ScreenNotifyBase = OpenLibrary("screennotify.library", 0);
  97.     IconBase = OpenLibrary("icon.library", 37);
  98.  
  99.     GuiGFXBase = OpenLibrary("progdir:libs/guigfx.library", GUIGFX_VERSION);
  100.     if (!GuiGFXBase)
  101.     {
  102.         GuiGFXBase = OpenLibrary("guigfx.library", GUIGFX_VERSION);
  103.     }
  104.     if (!GuiGFXBase)
  105.     {
  106.         printf("*** could not open guigfx.library v%d.\n", GUIGFX_VERSION);    
  107.     }
  108.  
  109.  
  110.     if (GuiGFXBase && MainPool && IconBase)
  111.     {
  112.         srand48(time(NULL));
  113.         success = TRUE;
  114.     }
  115.  
  116.  
  117.     if (!success)
  118.     {
  119.         CloseGlobal();
  120.     }
  121.  
  122.     return success;    
  123. }
  124.  
  125.  
  126.  
  127. /*********************************************************************
  128. ----------------------------------------------------------------------
  129.  
  130.     custom memory management
  131.     
  132.     Malloc()
  133.     Malloclear()
  134.     Free()
  135.  
  136. ----------------------------------------------------------------------
  137. *********************************************************************/
  138.  
  139. static LONG alloccount = 0;
  140. static LONG allocbytes = 0;
  141.  
  142.  
  143. void *Malloc(unsigned long size)
  144. {
  145.     ULONG *buf;
  146.     
  147.     if (buf = AllocPooled(MainPool, size + sizeof(ULONG)))
  148.     {
  149.         *buf++ = size;
  150.  
  151.         alloccount++;
  152.         allocbytes += size + sizeof(ULONG);
  153.     }
  154.     
  155.     return (void *) buf;
  156. }
  157.  
  158.  
  159. void *Malloclear(unsigned long size)
  160. {
  161.     ULONG *buf;
  162.     
  163.     if (buf = AllocPooled(MainPool, size + sizeof(ULONG)))
  164.     {
  165.         *buf++ = size;
  166.  
  167.         memset(buf, 0, size);
  168.  
  169.         alloccount++;
  170.         allocbytes += size + sizeof(ULONG);
  171.     }
  172.     
  173.     return (void *) buf;
  174. }
  175.  
  176.  
  177. void Free(void *mem)
  178. {
  179.     if (mem)
  180.     {
  181.         ULONG *buf = (ULONG *) mem;
  182.  
  183.         --buf;
  184.  
  185.         alloccount--;
  186.         allocbytes -= *buf + sizeof(ULONG);
  187.         
  188.         FreePooled(MainPool, buf, *buf + sizeof(ULONG));
  189.     }
  190. }
  191.  
  192.  
  193. static void MemStats(LONG *numalloc, LONG *numbytes)
  194. {
  195.     if (numalloc)
  196.     {
  197.         *numalloc = alloccount;
  198.     }
  199.  
  200.     if (numbytes)
  201.     {
  202.         *numbytes = allocbytes;
  203.     }
  204. }
  205.